package com.kun.alldb.wrapper;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;

import java.io.Serializable;
import java.util.Collection;

/**
 * 常量字符包装类
 * @author kun.li
 */
public class ConstantWrapper implements Serializable {
    /**
     * 前置包装符号
     */
    private Character preWrapQuote;
    /**
     * 后置包装符号
     */
    private Character sufWrapQuote;

    public ConstantWrapper() {
    }

    public ConstantWrapper(Character wrapQuote) {
        this.preWrapQuote = wrapQuote;
        this.sufWrapQuote = wrapQuote;
    }

    public ConstantWrapper(Character preWrapQuote, Character sufWrapQuote) {
        this.preWrapQuote = preWrapQuote;
        this.sufWrapQuote = sufWrapQuote;
    }

    /**
     * 包装字段名<br>
     * 有时字段与SQL的某些关键字冲突，导致SQL出错，因此需要将字段名用单引号或者反引号包装起来，避免冲突
     *
     * @param field 字段名
     * @return 包装后的字段名
     */
    public String wrap(String field) {
        if (preWrapQuote == null || sufWrapQuote == null || StrUtil.isBlank(field)) {
            return field;
        }

        //如果已经包含包装的引号，返回原字符
        if (StrUtil.isSurround(field, preWrapQuote, sufWrapQuote)) {
            return field;
        }

        //对于Oracle这类数据库，表名中包含用户名需要单独拆分包装
        if (field.contains(StrUtil.DOT)) {
            final Collection<String> target = CollUtil.edit(StrUtil.split(field, CharUtil.DOT, 2), t -> StrUtil.format("{}{}{}", preWrapQuote, t, sufWrapQuote));
            return CollectionUtil.join(target, StrUtil.DOT);
        }

        return StrUtil.format("{}{}{}", preWrapQuote, field, sufWrapQuote);
    }

    public Character getPreWrapQuote() {
        return preWrapQuote;
    }

    public Character getSufWrapQuote() {
        return sufWrapQuote;
    }
}
